package com.wn.sk.member.core.exception;

import com.wn.common.api.Result;
import com.wn.common.api.status.impl.BusinessCode;
import org.springframework.validation.FieldError;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

/**
 * @author yellow Docter
 * @date 2022 -09-06
 * @desc
 *
 * 全局异常处理：
 *   @RestControllerAdvice + @ExceptionHandler 注解
 */
@RestControllerAdvice
public class GlobalException {

    /**
     *  处理参数校验的异常
     * @return
     */
    @ExceptionHandler(MethodArgumentNotValidException.class)
    public Result<Object> handlerMethodArgumentNotValidException(MethodArgumentNotValidException argumentNotValidException){

        //拿到校验的 失败的字段的集合
        List<FieldError> fieldErrors = argumentNotValidException.getBindingResult().getFieldErrors();

        //获取失败字段的信息
        //存储到map中
//        Map<String,String> mapMsg = new HashMap<>();
//        for (FieldError fieldError : fieldErrors) {
//            String key = fieldError.getField();
//            String msgValue = fieldError.getDefaultMessage();
//            mapMsg.put(key,msgValue);
//        }

        //通过流操作 把 stream 收集成map
        Map<String, String> map = fieldErrors.stream().collect(
                Collectors.toMap(FieldError::getField, FieldError::getDefaultMessage)
        );
        return Result.error(map);
    }

    /**
     * 处理login的异常
     * @param e
     * @return
     */
    @ExceptionHandler(LoginException.class)
    public Result<String> handlerLoginException(Exception e){
        return Result.error(BusinessCode.LOGIN_FAIL);
    }

    /**
     * 处理其他的异常
     * @param e
     * @return
     */
    @ExceptionHandler(Exception.class)
    public Result<String> handlerMethodException(Exception e){
        return Result.error();
    }
}
